// =====================  引用  开始  ======================
console.log('=====================  引用  开始  ======================');
// 声明 obj 指向 {name: 'xm'};
let obj = { name: 'xm' };

// 声明 ali 指向 obj，由于 obj 指向 栈{name: 'xm'}, 所以 ali 指向 栈{name: 'xm'}
// 此时有2个引用，指向  { name: 'xm' }
let ali = obj;

// obj 指向了 null, 此时 { name: 'xm' } 还是可达的，因为 ali 指向 { name: 'xm' }
obj = null;

console.log('=====================  引用  结束  ======================');
// =====================  引用  结束  ======================


// =====================  可达与不可达2    开始  ======================
console.log('=====================  可达与不可达2    开始  ======================');


function objGroup(obj1, obj2) {
    obj1.next = obj2;
    obj2.prev = obj1;
    return {
        o1: obj1,
        o2: obj2
    }
}

const objgr = objGroup({ name: 'obj1'}, { name: 'obj2' });

console.log(Object.assign({}, objgr))

console.log('=====================  可达与不可达2    结束  ======================');

    //                             global
    //                               |
    //                               |
    //                               |
    //  -----------------------------objgr-------------------------
    // |                                                           |
    // |                                                           |
    // |                                                           |
    // |                                                           |
    // obj1 ------------------------next------------------------ -> obj2
    // obj1 <------------------------prev------------------------- obj2


delete objgr.o1; // 去掉  objgr ---- obj1
delete objgr.obj2.prev;   // 去掉  obj2 --prev- -> obj1
// 此时 obj1 处于不可达状态
console.log(Object.assign({}, objgr))

// =====================  可达与不可达2    结束  ======================